pvh: do not allow PVH guests to change paging modes
authorMukesh Rathor <mukesh.rathor@oracle.com>
Wed, 13 Nov 2013 08:35:58 +0000 (09:35 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 13 Nov 2013 08:35:58 +0000 (09:35 +0100)
Signed-off-by: Mukesh Rathor <mukesh.rathor@oracle.com>
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Tim Deegan <tim@xen.org>
Acked-by: Keir Fraser <keir@xen.org>
Acked-by: Eddie Dong <eddie.dong@intel.com>
xen/arch/x86/hvm/hvm.c

index 484319f8eb83e1fccdaa01576343fc38704873fa..4df46bee093d5c25c532c1a4a06c92c08d9b3d38 100644 (file)
@@ -1818,6 +1818,15 @@ int hvm_set_cr0(unsigned long value)
          (value & (X86_CR0_PE | X86_CR0_PG)) == X86_CR0_PG )
         goto gpf;
 
+    /* A pvh is not expected to change to real mode. */
+    if ( is_pvh_vcpu(v)
+         && (value & (X86_CR0_PE | X86_CR0_PG)) != (X86_CR0_PG | X86_CR0_PE) )
+    {
+        printk(XENLOG_G_WARNING
+               "PVH attempting to turn off PE/PG. CR0:%lx\n", value);
+        goto gpf;
+    }
+
     if ( (value & X86_CR0_PG) && !(old_value & X86_CR0_PG) )
     {
         if ( v->arch.hvm_vcpu.guest_efer & EFER_LME )